﻿// // ******************************************************************
// //       /\ /|       @file       SubtitleCommandHandler.cs
// //       \ V/        @brief      await29
// //       | "")       @author     Await, 285283010@qq.com
// //       /  |
// //      /  \\        @Modified   2025-01-09 20:01
// //    *(__\_\        @Copyright  Copyright (c) , 2025-01-04 17:01 Await
// // ******************************************************************

using AutomaticSubtitles.Service.Application.Media.Commands;
using AutomaticSubtitles.Service.DataAccess.Model;
using AutomaticSubtitles.Service.Domain.Media;

namespace AutomaticSubtitles.Service.Application.Media;

public class SubtitleCommandHandler(IServiceProvider serviceProvider, ISubtitleRepository repository, ILogger<SubtitleCommandHandler> logger) : BaseAutoService
{
    [EventHandler]
    public async Task CreateSubtitle(AddSubListDataCommand command)
    {
        using var source = serviceProvider.CreateScope();
        // var _repository = source.ServiceProvider.GetRequiredService<ISubtitleRepository>();
        // var _logger = source.ServiceProvider.GetRequiredService<ILogger<SubtitleCommandHandler>>();
        var allSubtitles = (await repository.GetListAsync()).ToList();
        if (command.subtitles != null)
        {
            Dictionary<string, Auto_Subtitle> existingDict = [];
            foreach (var item in allSubtitles)
            {
                if (existingDict.ContainsKey($"{item.Name}_{item.Path}_{item.Language}_{item.Size}_{item.Index ?? 0}"))
                    continue;
                existingDict[$"{item.Name}_{item.Path}_{item.Language}_{item.Size}_{item.Index ?? 0}"] = item;
            }
            // var existingDict = allSubtitles.ToDictionary(s => $"{s.Name}_{s.Path}_{s.Language}_{s.Size}_{s.Index ?? 0}");
            // var existingDict = allSubtitles.ToDictionary(s => $"{s.Name}_{s.Path}_{s.Language}_{s.Size}_{s.Index ?? 0}");

            var newSubtitles = command.subtitles.Where(s => !existingDict.ContainsKey($"{s.Name}_{s.Path}_{s.Language}_{s.Size}_{s.Index ?? 0}")).ToList();
            var deleteSubtitles = allSubtitles.Where(s =>
                !command.subtitles.Any(ns => ns.Name == s.Name && ns.Path == s.Path && ns.Language == s.Language && ns.Size == s.Size && ns.Index == s.Index)).ToList();
            await repository.AddRangeAsync(newSubtitles);
            await repository.RemoveRangeAsync(deleteSubtitles);
            //存在的更新 UpdateTime
            var updateSubtitles = allSubtitles.Where(s =>
                command.subtitles.Any(ns => ns.Name == s.Name && ns.Path == s.Path && ns.Language == s.Language && ns.Size == s.Size && ns.Index == s.Index)).ToList();
            foreach (var item in updateSubtitles)
                item.UpdateTime = DateTime.Now;
            await repository.UpdateRangeAsync(updateSubtitles);
            command.Result = allSubtitles.Count + newSubtitles.Count;
            logger.LogWarning($"新增字幕 {newSubtitles.Count} 条；删除字幕 {deleteSubtitles.Count} 条；更新字幕 {updateSubtitles.Count} 条；");
        }
        else
        {
            await repository.RemoveRangeAsync(allSubtitles);
            command.Result = allSubtitles.Count;
            logger.LogWarning($"删除字幕 {allSubtitles.Count} 条；");
        }

        if (command.deleteMedia != null)
        {
            List<Auto_Subtitle>? subtitles = [];
            foreach (var item in command.deleteMedia) subtitles = allSubtitles.Where(s => s.VideoId == item.Id).ToList();
            if (subtitles.Count > 0)
            {
                await repository.RemoveRangeAsync(subtitles);
                logger.LogWarning($"删除字幕 {subtitles.Count} 条；");
            }
        }

        // await _repository.UnitOfWork?.SaveChangesAsync();
        // await _repository.UnitOfWork?.CommitAsync();
        // source.Dispose();


        // // 获取现有字幕数据
        // var existingSubtitles = (await repository.GetListAsync()).ToList();
        // // var existingSubtitles = await repository.GetCountAsync();
        // // var existingSubtitles = (await repository.GetList());
        // if (existingSubtitles.Count != 0)
        // {
        //     // await repository.RemoveRangeAsync(existingSubtitles);
        //     await repository.RemoveRange(existingSubtitles);
        //     var msg2 = $"删除字幕 {existingSubtitles.Count} 条；";
        //     logger.LogWarning(msg2);
        // }
        // // 筛选需要新增的字幕
        // if (command.subtitles != null)
        // {
        //     await repository.AddRangeAsync(command.subtitles);
        //     var msg = $"新增字幕 {command.subtitles.Count} 条；";
        //     logger.LogWarning(msg);


        //     // // 使用字幕文件路径和媒体ID作为唯一标识
        //     // var existingDict = existingSubtitles.ToDictionary(
        //     //     s => $"{s.Path}_{s.VideoId}",
        //     //     s => s
        //     // );
        //     // var newSubtitles = command.subtitles
        //     //     .Where(s => !existingDict.ContainsKey($"{s.Path}_{s.VideoId}"))
        //     //     .ToList();
        //     //
        //     // // 筛选需要更新的字幕
        //     // List<Auto_Subtitle>? updatedSubtitles = null;
        //     // if (existingSubtitles is { Count : > 0 })
        //     //     foreach (var item in command.subtitles)
        //     //     {
        //     //         var firstOrDefault = existingSubtitles.FirstOrDefault(x => x.Path == item.Path && x.VideoId == item.VideoId);
        //     //         if (firstOrDefault == null) continue;
        //     //         updatedSubtitles ??= [];
        //     //         firstOrDefault.UpdateTime = DateTime.Now;
        //     //         updatedSubtitles.Add(firstOrDefault);
        //     //     }
        //     // // List<Auto_Subtitle> updatedSubtitles = command.subtitles
        //     // //     .Where(s => existingDict.ContainsKey($"{s.Path}_{s.VideoId}"))
        //     // //     .ToList();
        //     //
        //     // // 筛选需要删除的字幕
        //     // var deletedSubtitles = existingSubtitles
        //     //     .Where(s => !command.subtitles.Any(ns =>
        //     //         ns.Path == s.Path && ns.VideoId == s.VideoId))
        //     //     .ToList();
        //     //
        //     // // 执行数据库操作
        //     // if (newSubtitles.Count != 0)
        //     // {
        //     //     await repository.AddRangeAsync(newSubtitles);
        //     //     var msg = $"新增字幕 {newSubtitles.Count} 条；";
        //     //     logger.LogWarning(msg);
        //     // }
        //     //
        //     // if (updatedSubtitles != null && updatedSubtitles.Count != 0)
        //     // {
        //     //     await repository.UpdateRangeAsync(updatedSubtitles);
        //     //     var msg = $"更新字幕 {updatedSubtitles.Count} 条；";
        //     //     logger.LogWarning(msg);
        //     // }
        //     //
        //     // if (deletedSubtitles.Count != 0)
        //     // {
        //     //     await repository.RemoveRangeAsync(deletedSubtitles);
        //     //     var msg = $"删除字幕 {deletedSubtitles.Count} 条；";
        //     //     logger.LogWarning(msg);
        //     // }
        // }


        // command.Result++;
    }
}